package while_lang.ast;

import java.util.Random;

import while_lang.ast.exps.Variable;
import while_lang.semantics.State;
import while_lang.semantics.SymbolTable;
import while_lang.semantics.Type;

/** Subcategoría sintáctica de las expresiones de While que pueden ser asignadas,
 *  y por lo tanto figurar en la parte izquierda de una asignación. Éstas son 
 *  las variables y las referencias a arrays. 
 *  @author Leonardo Val.
 */
public abstract class Ref extends Exp {

	/** Genera una instancia aleatoria de Ref. 
	 */
	public static Ref generate(Random random, int min, int max) {
		return Variable.generate(random, min, max);
	}
	
	/** Además de poder obtener valores de ellas, las referencias se pueden
	 *  asignar valores.
	 */
	public abstract Object assign(State state, Object value);
	
	/** Verifica que la asignación se pueda realizar, como parte del chequeo de 
	 *  tipos. Actualiza la tabla de símbolos de ser necesario. En este caso 
	 *  retorna true, sino false.
	 */
	public abstract boolean checkAssignment(SymbolTable table, Type type);
}
